#define _CRT_SECURE_NO_WARNINGS 1
#include "Stack.h"

//int main()
//{
//	Stack s = { 0 };
//	StackInit(&s);
//
//	StackPush(&s, 1);
//	StackPush(&s, 2);
//	StackPush(&s, 3);
//	StackPush(&s, 4);
//
//	bool ret = StackEmpty(&s);
//	if (ret)
//	{
//		printf("empty\n");
//	}
//	else
//	{
//		printf("no empty\n");
//	}
//	printf("%d\n", GetStackTop(&s));
//	StackPop(&s);
//	printf("%d\n", GetStackTop(&s));
//	StackPop(&s);
//	printf("%d\n", GetStackTop(&s));
//	StackPop(&s);
//	printf("%d\n", GetStackTop(&s));
//	StackPop(&s);
//
//	ret = StackEmpty(&s);
//	if (ret)
//	{
//		printf("empty\n");
//	}
//	else
//	{
//		printf("no empty\n");
//	}
//
//	StackDestory(&s);
//	return 0;
//}
//
//
////判断有效括号
//bool isValid(char* s)
//{
//    Stack Sta = { 0 };
//    StackInit(&Sta);
//
//    while (*s)
//    {
//        if (*s == '('
//            || *s == '['
//            || *s == '{')
//        {
//            //左括号入栈
//            StackPush(&Sta, *s);
//        }
//        else
//        {
//            if (StackEmpty(&Sta))
//            {
//                StackDestory(&Sta);
//                return false;
//            }
//            //右括号出栈
//            char temp = GetStackTop(&Sta);
//            if (temp == '(' && *s != ')'
//                || temp == '[' && *s != ']'
//                || temp == '{' && *s != '}')
//            {
//                StackDestory(&Sta);
//                return false;
//            }
//            StackPop(&Sta);
//        }
//        s++;
//    }
//
//    //如果栈不为空，说明括号数量不匹配
//    if (!StackEmpty(&Sta))
//    {
//        StackDestory(&Sta);
//        return false;
//    }
//
//    StackDestory(&Sta);
//    return true;
//}



//int main()
//{
//	Stack s = { 0 };
//	StackInit(&s);
//
//	StackPush(&s, 1);
//	StackPush(&s, 2);
//	StackPush(&s, 3);
//	StackPush(&s, 4);
//
//	int top = GetStackTop(&s);
//	printf("%d\n", top);
//
//	StackPop(&s);//123
//
//	top = GetStackTop(&s);
//	printf("%d\n", top);
//
//	StackPop(&s);//12
//
//	top = GetStackTop(&s);
//	printf("%d\n", top);
//
//
//	StackPop(&s);//1
//
//	top = GetStackTop(&s);
//	printf("%d\n", top);
//
//
//	return 0;
//}



typedef struct
{
    Stack pushstack;
    Stack popstack;
} MyQueue;

//队列的初始化
MyQueue* myQueueCreate()
{
    MyQueue* mq = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&(mq->pushstack));
    StackInit(&(mq->popstack));

    return mq;
}

void myQueuePush(MyQueue* obj, int x)
{
    //直接向插入栈插入数据
    StackPush(&(obj->pushstack), x);
}

int myQueuePop(MyQueue* obj)
{
    int top = myQueuePeek(obj);
    StackPop(&(obj->popstack));
    return top;
}

int myQueuePeek(MyQueue* obj)
{
    //判断删除栈是否为空
    if (StackEmpty(&(obj->popstack)))
    {
        //如果为空从插入栈导数据
        while (!StackEmpty(&(obj->pushstack)))
        {
            StackPush(&(obj->popstack), GetStackTop(&(obj->pushstack)));
            StackPop(&(obj->pushstack));
        }
    }
    //删除栈不为空直接返回删除栈的栈顶元素
    return GetStackTop(&(obj->popstack));
}

bool myQueueEmpty(MyQueue* obj)
{
    return StackEmpty(&(obj->pushstack)) && StackEmpty(&(obj->popstack));
}

//队列的销毁
void myQueueFree(MyQueue* obj)
{
    StackDestory(&(obj->pushstack));
    StackDestory(&(obj->popstack));

    free(obj);
    obj = NULL;
}

int main()
{
    MyQueue* mq = myQueueCreate();

    myQueuePush(mq, 1);
    myQueuePush(mq, 2);
    myQueuePush(mq, 3);
    myQueuePush(mq, 4);

   //printf("%d\n", myQueuePeek(mq));
    printf("%d\n", myQueuePop(mq));
    return 0;
}